<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 先看看传统的构造函数
        function Person(name,age){
            this.name = name;
            this.age = age;
        }
        // 名字年龄这些可以每个实例都有一个，但是sayName这种公用的方法肯定没必要没人都给搞一个，太浪费内存空间了。
        // 所以我们都是放在prototype上，不过这么做的缺点就是，原型上的东西很容易不小心就被覆盖了
        Person.prototype.sayName = function(){
            console.log('hello,我是'+this.name);
        }
        let person = new Person('mks',18);

        // 继承
        function Student(name,age,grade){
            Person.call(this,name,age);//通过call方法改变Person的this指向，即可实现继承
            this.grade = grade;
        }
        // 但是Person的原型上的东西怎么被继承呢？很简单那
        Student.prototype = Person.prototype;//把Person的原型赋值给Student的原型即可
        Student.prototype.constructor = Student;//别忘了把Student原型上的constructor赋值回来
        let student = new Student('mks',18,'五年级');

        /*
            原型链
                原型链的基本原理：任何一个实例，通过原型链，找到它上面的原型，该原型对象中的方法和属性，可以被所有的原型实例共享
        */ 
    </script>
</body>
</html>